/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.editor.basis;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;

import de.mnit.basis.crypt.JavaBase64;
import de.mnit.basis.daten.WandleText;
import de.mnit.basis.daten.struktur.gruppe.Gruppe2;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.statisch.FarbManager;
import de.mnit.basis.sys.Ausgabe;

/**
 * @author Michael Nitsche
 * 26.06.2010	Erstellt
 *
 * a;
 * start,laenge,SUD,style,linkart,link;.....
 */
public class KonverterTF {

	// TEXT FORMAT

	public static Gruppe2<String,String> zuDB(String text, StyleRange[] styles) {
		StringBuilder sb=new StringBuilder();
		sb.append("b;"); //Format
		boolean eins=true;
		for(StyleRange sr : styles) {
			if(!eins)
				sb.append(";");
			else
				eins=false;
//			Ausgabe.debug(sr);
			iStyle2String(sb, sr);
		}
		return Gruppe2.neu(text, sb.toString());
	}

	private static void iStyle2String(StringBuilder sb, StyleRange sr) {
		sb.append(sr.start+","+sr.length+",");
		//Flags
		if(sr.strikeout)
			sb.append("S");
		if(sr.underline && sr.underlineStyle==SWT.UNDERLINE_SINGLE)
			sb.append("U");
		if(sr.underline && sr.underlineStyle==SWT.UNDERLINE_DOUBLE)
			sb.append("D");
		if(sr.font!=null && sr.font.getFontData().length>0) //Sehr einfach, naja, font wird nur in dem Fall gesetzt!
			sb.append("H");

		sb.append(",");
		//int
		sb.append(sr.fontStyle);
		sb.append(",");
		boolean link=sr.underline && sr.underlineStyle==SWT.UNDERLINE_LINK && sr.data!=null;
		if(link) {
			sb.append(((LinkInfo)sr.data).art.zeichen+",");
			sb.append(JavaBase64.verschluesseln((""+((LinkInfo)sr.data).daten).getBytes()));
		}
		else
			sb.append(",");
	}

//	private static void style2StringZukunft(StringBuilder sb, StyleRange sr) {
//		sb.append(sr.start+","+sr.length+";");
//		//Schrift
//		if(sr.font!=null)
//			Ausgabe.debug(sr.font.getFontData());
//		//Flags
//		sb.append((sr.strikeout ? "S" : "")
//				 +(sr.underline ? "U" : "")
//				 +";");
//		//int
//		sb.append(sr.borderStyle);
//		sb.append(","+sr.fontStyle);
//		sb.append(","+sr.rise);
//		sb.append(","+sr.underlineStyle+";");
//
//		//Farben
//		if(sr.background!=null) //H
//			Ausgabe.debug(sr.font, sr.background.getRGB().toString());
//		if(sr.borderColor!=null) //B
//			Ausgabe.debug(sr.font, sr.background.getRGB().toString());
//		if(sr.foreground!=null) //F
//			Ausgabe.debug(sr.font, sr.background.getRGB().toString());
//		if(sr.strikeoutColor!=null) //S
//			Ausgabe.debug(sr.font, sr.background.getRGB().toString());
//		if(sr.underlineColor!=null) //U
//			Ausgabe.debug(sr.font, sr.background.getRGB().toString());
//	}

	public static Gruppe2<String,StyleRange[]> vonDB(String text, String format, TE_Format tef) {
		if(text==null || text.length()==0)
			return Gruppe2.neu("", new StyleRange[0]);

		char f=format.charAt(0);
		if(f!='a' && f!='b')
			Fehler.sonstige.da_Untypisch("Format: "+f);
		format=format.substring(2, format.length());
//		format=format.replace(';', ',');
//		format=format.replace('/', ';');
//		format=format.replace(";", ",,;");
//		format+=",,";
//		Ausgabe.debug(format);

		String styletrenner= f=='a' ? "/" : ";";

		String[] sl=WandleText.zuStringArray(styletrenner, format);
		int anzahl=sl.length==1 && sl[0].length()==0 ? 0 : sl.length;

		StyleRange[] sr=new StyleRange[anzahl];
		for(int i=0; i<anzahl;)
			if(f=='a')
				sr[i]=iStyleA(sl[i++]);
			else
				sr[i]=iStyleB(tef, sl[i++]);
		return Gruppe2.neu(text, sr);
	}

	private static StyleRange iStyleA(String s) {
//		Ausgabe.debug(s);
		String[] t=WandleText.zuStringArray(";",s);
//		Ausgabe.debug(t);
		StyleRange sr=new StyleRange();

		String[] sl=WandleText.zuStringArray(",", t[0]);
//		Ausgabe.debug(sl);
		sr.start=Integer.parseInt(sl[0]);
		sr.length=Integer.parseInt(sl[1]);

		String flags=t[1];
		if(flags.indexOf('S')>=0)
			sr.strikeout=true;
		if(flags.indexOf('U')>=0) {
			sr.underline=true;
			sr.underlineStyle=SWT.UNDERLINE_SINGLE;
		}

		sr.fontStyle=Integer.parseInt(t[2]);
		return sr;
	}

	/**
	 * TODO Komplett auf TE_Format umstellen!!!
	 */
	private static StyleRange iStyleB(TE_Format f, String s) {
//		Ausgabe.debug(s);
		String[] t=WandleText.zuStringArray(",", s);
		Ausgabe.debug(t);
		StyleRange sr=new StyleRange();

		sr.start=Integer.parseInt(t[0]);
		sr.length=Integer.parseInt(t[1]);

		String flags=t[2];
		if(flags.indexOf('S')>=0)
			sr.strikeout=true;
		if(flags.indexOf('U')>=0) {
			sr.underline=true;
			sr.underlineStyle=SWT.UNDERLINE_SINGLE;
		}
		if(flags.indexOf('D')>=0) {
			sr.underline=true;
			sr.underlineStyle=SWT.UNDERLINE_DOUBLE;
		}
		if(flags.indexOf('H')>=0)
			f.setze(sr, TE_STYLE.UEBERSCHRIFT, true);

		sr.fontStyle=Integer.parseInt(t[3]);

		if(t[4].length()>0) {
			sr.underline=true;
			sr.underlineStyle=SWT.UNDERLINE_LINK;
			final LINKART art=LINKART.gib((""+t[4]).charAt(0));
			if(art==LINKART.ID)
				sr.foreground=FarbManager.gFarbe(0, 176, 0); //Max 192

			String base64=t[5];
			final byte[] data=JavaBase64.entschluesseln(base64);
			sr.data=new LinkInfo("",art, new String(data));
		}

		return sr;
	}

}
